package rock.negagame.client.sprites.control;

import java.util.Vector;

import rock.negagame.client.sprites.Bala;
import rock.negagame.client.sprites.Explosion;
import rock.negagame.client.sprites.Jugador;
import rock.negagame.client.sprites.Sprite;
import rock.negagame.client.sprites.enemigos.Enemigo;
import rock.negagame.client.sprites.enemigos.FabricaEnemigos;

import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;

public class GameController {

	public Label l = new Label("espera");
	
	public static Pantalla pantalla;
	public Jugador jugador;
	public Vector<Enemigo> enemigos;
	public Vector<Bala> balas;
	
	int puntuacion = 0;
	
	public TimerGame timer;
	public TimerEnemigos fabricanteEnemigos;
	
	boolean bandera = false;
	
	static GameController game = null;
	
	private GameController(){
		timer = new TimerGame();
		fabricanteEnemigos = new TimerEnemigos();
	}
	public static GameController getGame(){
		if(game==null)	game = new GameController();
		return game;
	}
	public void start(){
		cargaImagenes();
		inicio();
	}
	public void sumaPuntuacion(int n){
		puntuacion = puntuacion + n;
	}
	public int getPuntuacion(){
		return puntuacion;
	}
	private void cargaImagenes(){
		Image.prefetch("jugadores/yoPlant1.png");
		Image.prefetch("bola.gif");
	}
	private void inicio(){
		pantalla = Pantalla.getPantalla();
		Explosion.getInastance().inicia();
		jugador = new Jugador(new Image("jugadores/yoPlant1.png"));
		Pantalla.getPantalla().add(jugador);
		jugador.setPosition();
		
		enemigos = new Vector();
		//Enemigo enemigo1= new Enemigo(new Image("enemigos/notamusical.png"));
		//Enemigo enemigo2= new Enemigo(new Image("enemigos/notamusical1.png"));
		enemigos.add(FabricaEnemigos.getInstance().getEnemigo0());
		enemigos.add(FabricaEnemigos.getInstance().getEnemigo1());
		insertarEnemigosEnPantalla();
		
		balas = new Vector();

		timer.scheduleRepeating(30);
		fabricanteEnemigos.scheduleRepeating(5000);
	}
	
	public void addEnemigo(Enemigo e){
		enemigos.add(e);
		Pantalla.getPantalla().add(e);
	}
	
	private void insertarEnemigosEnPantalla(){
		for(int i=0; i<enemigos.size(); i++){
			Enemigo s = enemigos.get(i);
			Pantalla.getPantalla().add(s);
		}
	}
	
	public void elimina(Sprite sp){
		if(sp instanceof Enemigo){
			Pantalla.getPantalla().remove(sp);
			enemigos.remove(sp);
			sumaPuntuacion(Enemigo.PUNTUACION);
		}else if(sp instanceof Bala){
			Pantalla.getPantalla().remove(sp);
			balas.remove(sp);			
		}else if(sp instanceof Jugador){
			Pantalla.getPantalla().remove(jugador);
			if(!jugador.restaVida()){
				
				//FIN de JUEGO
			}else{
				jugador = new Jugador(new Image("jugadores/yoPlant1.png"));
				Pantalla.getPantalla().add(jugador);
				jugador.setPosition();
			}
		}
	}
	public void moverNavesEnemigas(){
		for(int i=0; i<enemigos.size(); i++){
			Enemigo s = enemigos.get(i);
			if(!s.mueve()){
				elimina(s);
			}
		}
		if(jugador.explotar) jugador.explota();
	}
	public void moverBalas(){
		for(int i=0; i<jugador.getBalas().size(); i++){
			Bala s = jugador.getBalas().get(i);
			if(s.activa) {
				s.mueve();
			}
		}
	}
	public void compruebaColisiones(){
		balasEnEnemigos();
		balasEnJugador();
		enemigosEnJugador();
	}
	
	private boolean compruebaSuperposicion(Sprite sp1, Sprite sp2){
	    int w1,h1,w2,h2,x1,y1,x2,y2;

	    w1=sp1.getWidth();
	    h1=sp1.getHeight();
	    w2=sp2.getWidth();
	    h2=sp2.getHeight();
	    x1=sp1.getPosX();
	    y1=sp1.getPosY();
	    x2=sp2.getPosX();
	    y2=sp2.getPosY();
	    if (((x1+w1)>x2) && ((y1+h1)>y2) && ((x2+w2)>x1 && ((y2+h2)>y1))) {
	        return true;
	    }else {
	        return false;
	    }
	}
	private void balasEnEnemigos(){
	    for(int i=0; i<jugador.getBalas().size(); i++){
	        Bala b = jugador.getBalas().get(i);
	        if(b.activa){
	           for(int j=0; j<enemigos.size(); j++){
	              Enemigo e = enemigos.get(j);
	              if(compruebaSuperposicion(b,e)){
	                  b.activa=false;
	                  b.setPosition(-40, 0);	                  
	                  e.explota();
	              }
	           }
	        }
	    }
	}
	private void balasEnJugador(){
	    
		for(int i=0; i<getBalas().size(); i++){
	        Bala b = getBalas().get(i);
	        if(b.activa){
	           if(compruebaSuperposicion(b,jugador)){
	               elimina(b);
	               jugador.explota();
	           }
	        }
	    }
	}
	private void enemigosEnJugador(){
	    for(int i=0; i<getEnemigos().size(); i++){
	        Enemigo b = getEnemigos().get(i);
	        //if(b.activa){
	           if(compruebaSuperposicion(b,jugador)){
	               b.explota();
	               jugador.explota();
	           }
	        //}
	    }
	}
	/**
	 * @return the balas
	 */
	public Vector<Bala> getBalas() {
		return balas;
	}
	/**
	 * @param balas the balas to set
	 */
	public void setBalas(Vector<Bala> balas) {
		this.balas = balas;
	}
	/**
	 * @return the jugador
	 */
	public Jugador getJugador() {
		return jugador;
	}
	/**
	 * @param jugador the jugador to set
	 */
	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}
	

/**
	 * @return the enemigos
	 */
	public Vector<Enemigo> getEnemigos() {
		return enemigos;
	}
	/**
	 * @param enemigos the enemigos to set
	 */
	public void setEnemigos(Vector<Enemigo> enemigos) {
		this.enemigos = enemigos;
	}
	//-------------------------------------------------------------	
	/*
	 *	EVENTOS CAPTURADOS POR EL TECLADO
	 */		
	/*
	 * 	EVENTO DISPARO
	 */
	public void eventoDisparo(){
		l.setText(" a disparar.........  ");
		jugador.dispara();
	}
	/*
	 * EVENTO EMPEZAR MOVIMIENTO JUGADOR
	 */
	public void eventoEmpieza(int code){
		if(!bandera){
			jugador.empieza(code);
		}
		bandera = true;		
	}
	/*
	 * EVENTO PARA MOVIMIENTO JUGADOR
	 */
	public void eventoPara(int code){
		bandera = false;
		jugador.para(code);
	}
}
